package br.uniceub.fsw.academicmobile.dao;

import br.uniceub.fsw.academicmobile.vo.HistoricoVO;
import br.uniceub.fsw.academicmobile.vo.MencaoVO;
import br.uniceub.fsw.academicmobile.vo.SgMencaoVO;
import br.uniceub.fsw.academicmobile.vo.TipoMencaoVO;
import java.sql.ResultSet;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;

/**
 * Dao responsável pelas operaçoes de banco associadas ao objeto Mencao
 * @author Christian Moryah
 */
public class MencaoDAO {

    private BD bd;
    
    public MencaoDAO(){
        bd = new BD();
    }
    
    /**
     * Retorna Sigla da mencao a partir de seu id
     * @param sgMencao vo carregando id da sigla
     * @return objeto SgMencaoVO
     */
    public SgMencaoVO consultarSgMencaoPorId(SgMencaoVO sgMencao){
        String SQL = "SELECT * FROM tb_sgmencao where ID_sgMencao = <01>";
        SQL = SQL.replaceAll("<01>", sgMencao.getIdSgMencao().toString());
        SgMencaoVO retorno = new SgMencaoVO();
        try{
            ResultSet rs = bd.getResultSet(SQL);
            if(rs.next()){ 
                retorno.setIdSgMencao(rs.getInt("ID_sgMencao"));
                retorno.setSgMencao(rs.getString("SG_mencao"));
            }
        } catch (Exception ex){
            System.err.println("MencaoDAO.consultarSgMencaoPorId: "+ ex.getMessage());
        }
        return retorno;
    }
    
    /**
     * Retorna objeto tipo de mencao a partir de seu id
     * @param tipoMencao vo carregando id da mencao
     * @return objeto TipoMencaoVO
     */
    public TipoMencaoVO consultarTipoMencaoPorId(TipoMencaoVO tipoMencao){
        String SQL = "SELECT * FROM tb_tipomencao where ID_tipoMencao = <01>";
        SQL = SQL.replaceAll("<01>", tipoMencao.getIdTipoMencao().toString());
        TipoMencaoVO retorno = new TipoMencaoVO();
        try{
            ResultSet rs = bd.getResultSet(SQL);
            if(rs.next()){ 
                retorno.setIdTipoMencao(rs.getInt("ID_tipoMencao"));
                retorno.setNoTipoMencao(rs.getString("NO_tipoMencao"));
            }
        } catch (Exception ex){
            System.err.println("MencaoDAO.consultarTipoMencaoPorId: "+ ex.getMessage());
        }
        return retorno;
    }
    
    /**
     * Retorna lista de mencoes apartir do historico
     * @param historico vo carregando o id do historico
     * @return ArrayList lista de mencoes
     */
    public ArrayList consultarMencaoPorHistorico(HistoricoVO historico){
        String SQL = "SELECT * FROM tb_mencao where tb_historico_ID_historico = <01>";
        SQL = SQL.replaceAll("<01>", historico.getIdHistorico().toString());
        ArrayList alist = new ArrayList();
        try{
            ResultSet rs = bd.getResultSet(SQL);
            while(rs.next()){
                MencaoVO mencao = new MencaoVO();
                mencao.setIdMencao(rs.getInt("ID_mencao"));
                mencao.setTbHistoricoIdHistorico(rs.getInt("tb_historico_ID_historico"));
                mencao.setTbTipoMencaoIdTipoMencao(rs.getInt("tb_tipoMencao_ID_tipoMencao"));
                mencao.setTbSgMencaoIdTipoMencao(rs.getInt("tb_SGMencao_ID_tipoMencao"));
                mencao.setDtMencao(rs.getDate("DT_mencao"));
                mencao.setDsMencao(rs.getString("DS_mencao"));
                alist.add(mencao);
            }
        } catch (Exception ex){
            System.err.println("MencaoDAO.consultarMencaoPorHistorico: "+ ex.getMessage());
        }
        return alist;
    }
    
    /**
     * Retorna todas as siglas de mencao
     * @return ArrayList lista de siglas
     */
    public ArrayList consultarTodasSiglasMencoes(){
        String SQL = "SELECT * FROM tb_sgmencao";
        ArrayList alist = new ArrayList();
        try{
            ResultSet rs = bd.getResultSet(SQL);
            while(rs.next()){
                SgMencaoVO sg = new SgMencaoVO();
                sg.setIdSgMencao(rs.getInt("ID_sgMencao"));
                sg.setSgMencao(rs.getString("SG_mencao"));
                alist.add(sg);
            }
        } catch (Exception ex){
            System.err.println("MencaoDAO.consultarMencaoPorHistorico: "+ ex.getMessage());
        }
        return alist;
    }
    
    /**
     * Altera o objeto mencao no banco
     * @param mencao vo carregando os dados da mencao
     * @return boolean true caso haja sucesso
     */
    public boolean alterarMencao(MencaoVO mencao){
        SimpleDateFormat formato = new SimpleDateFormat("yyyy-MM-dd");
        String SQL = "UPDATE tb_mencao SET tb_SGMencao_ID_tipoMencao=<01> , DT_mencao ='<02>'" +
                     " WHERE ID_Mencao=<03>";
        SQL = SQL.replaceAll("<01>", mencao.getTbSgMencaoIdTipoMencao().toString());
        SQL = SQL.replaceAll("<02>", formato.format(mencao.getDtMencao()));
        SQL = SQL.replaceAll("<03>", mencao.getIdMencao().toString());
        return bd.execSQL(SQL);
    }
    
    /**
     * Retorna mencoes a partir de um historico
     * @param hVO vo carregando id do historico
     * @return List lista de mencoes
     * @throws java.lang.Exception
     */
    public List<MencaoVO>  getMencaoByHistorico(HistoricoVO hVO) throws Exception{
    	String SQL="SELECT * FROM tb_mencao where tb_historico_ID_historico="+hVO.getIdHistorico();
    	ResultSet rs = bd.getResultSet(SQL);
    	ArrayList lMencaoVO = new ArrayList<MencaoVO>();
    	while(rs.next()){
    	    MencaoVO mVO=new MencaoVO();
    	    mVO.setDtMencao(rs.getDate("DT_mencao"));
    	    mVO.setDsMencao(rs.getString("DS_mencao"));
            mVO.setTbHistoricoIdHistorico(rs.getInt("tb_historico_ID_historico"));
            mVO.setTbTipoMencaoIdTipoMencao(rs.getInt("tb_tipoMencao_ID_tipoMencao"));
            mVO.setTbSgMencaoIdTipoMencao(rs.getInt("tb_SGMencao_ID_tipoMencao"));
    	    mVO.setIdMencao(rs.getInt("ID_mencao"));
    	    lMencaoVO.add(mVO);
    	}
    	return lMencaoVO;
    }
}